From 91aa0092a685c07949413d91847ded583cee31a7 Mon Sep 17 00:00:00 2001 From: oliskoli Date: Mon, 26 Mar 2007 22:23:58 +0000 Subject: [PATCH] Add new format "ggv_log". This format supports binary tracklogs used by EADS Geogrid Viewer. --- Makefile.in | 7 +- ggv_log.c | 276 +++++++++++++++++++++++++++++ reference/track/ggv_log-sample.log | Bin 0 -> 31397 bytes testo | 9 + vecs.c | 7 + 5 files changed, 297 insertions(+), 2 deletions(-) create mode 100644 ggv_log.c create mode 100644 reference/track/ggv_log-sample.log diff --git a/Makefile.in b/Makefile.in index 835e7bdb8..a086072bc 100644 --- a/Makefile.in +++ b/Makefile.in @@ -54,7 +54,8 @@ FMTS=magproto.o gpx.o geo.o mapsend.o mapsource.o garmin_tables.o \ tef_xml.o maggeo.o pathaway.o vitosmt.o gdb.o bcr.o coto.o \ ignrando.o stmwpp.o msroute.o cst.o nmn4.o mag_pdb.o compegps.o \ yahoo.o unicsv.o wfff_xml.o garmin_txt.o axim_gpb.o gpssim.o \ - wbt-200.o stmsdf.o gtrnctr.o dmtlog.o raymarine.o alan.o vitovtt.o + wbt-200.o stmsdf.o gtrnctr.o dmtlog.o raymarine.o alan.o vitovtt.o \ + ggv_log.o FILTERS=position.o radius.o duplicate.o arcdist.o polygon.o smplrout.o \ reverse_route.o sort.o stackfilter.o trackfilter.o discard.o \ @@ -443,6 +444,8 @@ geoniche.o: geoniche.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsmem.h \ jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h garmin_tables.h +ggv_log.o: ggv_log.c defs.h config.h queue.h gbtypes.h gbfile.h \ + jeeps/gpsmath.h globals.o: globals.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h gbversion.h glogbook.o: glogbook.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ @@ -664,7 +667,7 @@ vitosmt.o: vitosmt.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ vmem.o: vmem.c defs.h config.h queue.h gbtypes.h zlib/zlib.h zlib/zconf.h \ gbfile.h cet.h cet_util.h inifile.h waypt.o: waypt.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ - zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h + zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h grtcirc.h wbt-200.o: wbt-200.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ zlib/zconf.h gbfile.h cet.h cet_util.h inifile.h gbser.h grtcirc.h wfff_xml.o: wfff_xml.c defs.h config.h queue.h gbtypes.h zlib/zlib.h \ diff --git a/ggv_log.c b/ggv_log.c new file mode 100644 index 000000000..dbb14544a --- /dev/null +++ b/ggv_log.c @@ -0,0 +1,276 @@ +/* + + Support for "GeoGrid Viewer" binary tracklogs (*.log) + + Copyright (C) 2007 Olaf Klein, o.b.klein@gpsbabel.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include +#include + +#include "defs.h" +#include "grtcirc.h" +#include "jeeps/gpsmath.h" + +#define MYNAME "ggv_log" + +static gbfile *fin, *fout; +static int ggv_log_ver; + +static +arglist_t ggv_log_args[] = { + ARG_TERMINATOR +}; + +/******************************************************************************* +* %%% global callbacks called by gpsbabel main process %%% * +*******************************************************************************/ + +static void +ggv_log_rd_init(const char *fname) +{ + static char magic[32]; + int len = 0; + + fin = gbfopen(fname, "rb", MYNAME); + + for (;;) { + int cin; + + cin = gbfgetc(fin); + if (cin < 0) break; + + magic[len++] = cin; + + if (cin == '\0') { + double ver = 0; + char *sver; + if (strncmp(magic, "DOMGVGPS Logfile V", 18) != 0) break; + + sver = &magic[18]; + sscanf(sver, "%lf:", &ver); + ggv_log_ver = ver * 10; + if ((ggv_log_ver == 10) || (ggv_log_ver == 25)) return; /* header accepted */ + + fatal(MYNAME ": Sorry, unsupported version (%s)!\n", sver); + } + else if (len == sizeof(magic)) + break; + } + fatal(MYNAME ": Invalid header. Probably no " MYNAME " file!\n"); +} + +static void +ggv_log_rd_deinit(void) +{ + gbfclose(fin); +} + +static void +ggv_log_read(void) +{ + signed char *buf; + int bufsz = 0, len; + route_head *trk = NULL; + + switch(ggv_log_ver) { + case 10: bufsz = 0x2A; break; + case 25: bufsz = 0x6F; break; + } + + buf = xmalloc(bufsz); + + while ((len = gbfread(buf, 1, bufsz, fin))) { + int deg, min; + double xlat, xlon; + float sec; + struct tm tm; + waypoint *wpt; + + if (len != bufsz) break; + + if (trk == NULL) { + trk = route_head_alloc(); + track_add_head(trk); + } + + memset(&tm, 0, sizeof(tm)); + + wpt = waypt_new(); + + deg = (gbint16) le_read16(&buf[0]); + min = le_read16(&buf[2]); + sec = le_read_float(&buf[4]); + xlat = (double)deg + ((double)min / (double)60) + (sec / (double)3600.0); + wpt->latitude = xlat; + + deg = (gbint16) le_read16(&buf[8]); + min = le_read16(&buf[10]); + sec = le_read_float(&buf[12]); + xlon = (double)deg + ((double)min / (double)60) + (sec / (double)3600.0); + wpt->longitude = xlon; + + wpt->course = le_read16(&buf[16 + 0]); + + if (ggv_log_ver == 10) { + double secs; + + wpt->altitude = le_read16(&buf[16 + 2]); + wpt->speed = le_read16(&buf[16 + 4]); + tm.tm_year = le_read16(&buf[16 + 8]); + tm.tm_mon = le_read16(&buf[16 + 10]); + tm.tm_mday = le_read16(&buf[16 + 12]); + tm.tm_hour = le_read16(&buf[16 + 14]); + tm.tm_min = le_read16(&buf[16 + 16]); + secs = le_read_double(&buf[16 + 18]); + tm.tm_sec = (int)secs; + wpt->microseconds = (secs - tm.tm_sec) * 1000000; + } + else { + wpt->altitude = le_read16(&buf[16 + 4]); + wpt->sat = (unsigned char)buf[16 + 14]; + + /* other probably valid double values at offset: + + 22: 0.0 - 20.0 + 43: 0.0 - 59.0 + 51: -1.0 + 61: -1.0 + 79: .. - 20.0 ? speed over ground ? (++) + 87: ? course ? + 95: 0.0 - 3.1 (++) + 103: -1 + + */ + } + + if (wpt->altitude == 0) + wpt->altitude = unknown_alt; + + if (tm.tm_year >= 1900) { + tm.tm_year -= 1900; + if (tm.tm_mon > 0) { + tm.tm_mon--; + wpt->creation_time = mkgmtime(&tm); + } + } + + track_add_wpt(trk, wpt); + } + xfree(buf); +} + +static void +ggv_log_wr_init(const char *fname) +{ + fout = gbfopen(fname, "wb", MYNAME); + + gbfputcstr("DOMGVGPS Logfile V1.0:", fout); +} + +static void +ggv_log_wr_deinit(void) +{ + gbfclose(fout); +} + +static void +ggv_log_track_head_cb(const route_head *trk) +{ + queue *elem, *tmp; + waypoint *prev = NULL; + + QUEUE_FOR_EACH((queue *)&trk->waypoint_list, elem, tmp) { + double latmin, lonmin, latsec, lonsec; + int latint, lonint; + double course = 0, speed = 0; + struct tm tm; + waypoint *wpt = (waypoint *)elem; + double secs = 0; + + latint = wpt->latitude; + lonint = wpt->longitude; + latmin = 60.0 * (fabs(wpt->latitude) - latint); + lonmin = 60.0 * (fabs(wpt->longitude) - lonint); + latsec = 60.0 * (latmin - floor(latmin)); + lonsec = 60.0 * (lonmin - floor(lonmin)); + + if (wpt->creation_time > 0) { + tm = *gmtime(&wpt->creation_time); + tm.tm_mon += 1; + tm.tm_year += 1900; + } + else + memset(&tm, 0, sizeof(tm)); + + if (prev != NULL) { + course = heading_true_degrees( + prev->latitude, prev->longitude, + wpt->latitude, wpt->longitude); + speed = waypt_speed(prev, wpt); + } + if (wpt->creation_time > 0) + secs = (double)tm.tm_sec + ((double)wpt->microseconds / 1000000); + + gbfputint16((gbint16) latint, fout); + gbfputint16((gbint16) latmin, fout); + gbfputflt(latsec, fout); + gbfputint16((gbint16) lonint, fout); + gbfputint16((gbint16) lonmin, fout); + gbfputflt(lonsec, fout); + gbfputint16((gbint16) course, fout); + gbfputint16((gbint16) (wpt->altitude != unknown_alt) ? wpt->altitude : 0, fout); + gbfputint16((gbint16) speed, fout); + gbfputint16(0, fout); + gbfputint16(tm.tm_year, fout); + gbfputint16(tm.tm_mon, fout); + gbfputint16(tm.tm_mday, fout); + gbfputint16(tm.tm_hour, fout); + gbfputint16(tm.tm_min, fout); + gbfputdbl(secs, fout); + + prev = wpt; + } +} + +static void +ggv_log_write(void) +{ + track_disp_all(ggv_log_track_head_cb, NULL, NULL); +} + +/**************************************************************************/ + +ff_vecs_t ggv_log_vecs = { + ff_type_file, + { + ff_cap_none, /* waypoints */ + ff_cap_read | ff_cap_write, /* tracks */ + ff_cap_none /* routes */ + }, + ggv_log_rd_init, + ggv_log_wr_init, + ggv_log_rd_deinit, + ggv_log_wr_deinit, + ggv_log_read, + ggv_log_write, + NULL, + ggv_log_args, + CET_CHARSET_ASCII, 1 +}; +/**************************************************************************/ diff --git a/reference/track/ggv_log-sample.log b/reference/track/ggv_log-sample.log new file mode 100644 index 0000000000000000000000000000000000000000..9cbcba37e209082f7139ac8d7de8048f52569a53 GIT binary patch literal 31397 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 literal 0 HcmV?d00001 diff --git a/testo b/testo index 0664aac86..a79966f4a 100755 --- a/testo +++ b/testo @@ -1201,4 +1201,13 @@ rm -f ${TMPDIR}/mlink* ${PNAME} -i gpx -f reference/multiple-links.gpx -o gpx,gpxver=1.1 -F ${TMPDIR}/mlink-1.gpx compare ${TMPDIR}/mlink-1.gpx reference/multiple-links.gpx +# +# Geogrid Viewer tracklogs +# +rm -f ${TMPDIR}/ggv_log* +${PNAME} -i gdb -f ${REFERENCE}/gdb-sample.gdb -x track,pack -o ggv_log -F ${TMPDIR}/ggv_log-sample.log +bincompare ${REFERENCE}/track/ggv_log-sample.log ${TMPDIR}/ggv_log-sample.log +${PNAME} -i ggv_log -f ${REFERENCE}/track/ggv_log-sample.log -o ggv_log -F ${TMPDIR}/ggv_log-sample2.log +bincompare ${REFERENCE}/track/ggv_log-sample.log ${TMPDIR}/ggv_log-sample2.log + exit 0 diff --git a/vecs.c b/vecs.c index 4d7aedc68..202d9669a 100644 --- a/vecs.c +++ b/vecs.c @@ -115,6 +115,7 @@ extern ff_vecs_t raymarine_vecs; extern ff_vecs_t alanwpr_vecs; extern ff_vecs_t alantrl_vecs; extern ff_vecs_t vitovtt_vecs; +extern ff_vecs_t ggv_log_vecs; static vecs_t vec_list[] = { @@ -637,6 +638,12 @@ vecs_t vec_list[] = { "Vito SmartMap tracks (.vtt)", "vtt" }, + { + &ggv_log_vecs, + "ggv_log", + "Geogrid Viewer tracklogs (.log)", + "log" + }, { NULL, NULL, -- 2.30.2